package me.sdevil507.org.service;

import me.sdevil507.biz.common.exceptions.RoleCodeExistedException;
import me.sdevil507.biz.common.exceptions.RoleNameExistedException;
import me.sdevil507.org.dto.OrgResourceRelDto;
import me.sdevil507.org.dto.OrgRoleAllotResourcesParamsDto;
import me.sdevil507.org.dto.OrgRoleParamsDto;
import me.sdevil507.org.po.OrgPo;
import me.sdevil507.org.po.OrgRolePo;
import me.sdevil507.org.po.OrgRoleResourceRelPo;
import me.sdevil507.org.po.OrgUserPo;
import me.sdevil507.platform.po.PlatResourcePo;
import me.sdevil507.supports.jpa.PageParamsDTO;
import me.sdevil507.supports.jpa.SortParamsDTO;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 机构角色表[OrgRoleService]
 *
 * @author sdevil507
 * created on 2020-06-23 18:15:44
 */
public interface OrgRoleService {

    /**
     * 分页获取记录
     *
     * @param searchParamsDto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<OrgRolePo> readAllByPage(OrgRoleParamsDto searchParamsDto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 创建记录
     *
     * @param dto 传输类
     */
    void create(OrgRoleParamsDto dto) throws RoleNameExistedException, RoleCodeExistedException;

    /**
     * 更新记录
     *
     * @param dto 传输类
     */
    void update(OrgRoleParamsDto dto) throws RoleNameExistedException, RoleCodeExistedException;

    /**
     * 删除记录
     *
     * @param dto 传输类
     */
    void delete(OrgRoleParamsDto dto);

    /**
     * 分配用户角色
     *
     * @param roleId  角色id
     * @param userIds 用户id列表
     */
    void allotUsers(Long roleId, List<Long> userIds);

    /**
     * 分配角色资源
     *
     */
    void allotResources(OrgRoleAllotResourcesParamsDto dto);

    /**
     * 根据角色id获取用户列表
     *
     * @param id 角色id
     * @return 用户列表
     */
    List<OrgUserPo> readUsersById(Long id);

    /**
     * 根据角色id获取资源列表
     *
     * @param id 角色id
     * @return 用户列表
     */
    List<OrgRoleResourceRelPo> readResourcesById(Long id);

    /**
     * 获取登录用户的角色字符串
     *
     * @return 角色集合
     */
    Set<String> findRoles();

    void allotOrgs(Long roleId, List<Long> orgIds);

    void deleteOrgsOfUserId(Long id);

    Set<Long> findOrgs(Long id);

    void deleteOrgsByClassifyOfUserId(Long id);

    Map<String, Set<Long>> findOrgsByClassify(Long id);

    List<OrgPo> readOrgsById(Long id);

    List<OrgRolePo> searchOrgAllRoleData(OrgRoleParamsDto dto);

    List<OrgResourceRelDto> getUserPermissionModule(Long userId);

    Set<String> findPermissions();
}